import { ref } from "vue";

const rfidManager = uni.requireNativePlugin("TH-PlatformRFID");

const RFID_ERROR_MAP = {
	0: "执行成功",
	1: "未询查到电子标签",
	2: "电源不足，标签电源不足，无法执行存储写入操作",
	3: "存储器超限或不被支持的PC值",
	4: "存储器锁定，存储位置锁定永久锁定，且不可写入",
	5: "访问密码错误",
	9: "销毁密码错误",
	10: "销毁密码不能为全0",
	11: "电子标签不支持该命令",
	12: "对该命令，访问密码不能为0",
	13: "电子标签已经被设置了读保护，不能再次设置",
	14: "电子标签没有被设置读保护，不需要解锁",
	15: "非特定错误，标签不支持特定错误代码",
	16: "有字节空间被锁定，写入失败",
	17: "不能锁定",
	18: "已经锁定，不能再次锁定",
	19: "参数保存失败,但设置的值在读写模块断电前有效",
	20: "无法调整",
	48: "通讯错误",
	248: "天线检测错误",
	249: "命令执行出错",
	250: "有电子标签，但通信不畅，无法操作",
	251: "无电子标签可操作",
	252: "电子标签返回错误代码",
	253: "命令长度错误",
	254: "不合法的命令",
	255: "参数错误",
};

// 创建响应式数据存储
export const rfidValue = ref({
	tags: [],
	lastTag: null,
	isScanning: false,
	initialized: false, // 添加初始化状态
	error: null,
});

// 监听回调函数
const onTagHandler = (result) => {
	rfidValue.value.lastTag = result;
	if (!rfidValue.value.tags.includes(result.epc)) {
		rfidValue.value.tags.push(result.epc);
	}
};

const onTagEndHandler = (result) => {
	rfidValue.value.isScanning = false;
};

const rfid = {
	/**
	 * 初始化RFID（自动soundInit）
	 * @returns {Promise<boolean>} 返回初始化结果
	 */
	init() {
		return new Promise((resolve) => {
			rfidManager.soundInit();
			rfidManager.init((ret) => {
				rfidValue.value.initialized = ret;
				rfidValue.value.error = ret ? null : '初始化失败';

				if (ret) {
					// 绑定原生监听
					rfidManager.onInventoryTag(onTagHandler);
					rfidManager.onInventoryTagEnd(onTagEndHandler);
				}
				resolve(ret);
			});
		});
	},

	// 重置RFID数据
	reset() {
		rfidValue.value.tags = [];
		rfidValue.value.lastTag = null;
		rfidValue.value.isScanning = false;
		rfidValue.value.error = null;
	},
	soundPlay(type = 1) {
		rfidManager.soundPlay(type);
	},
	startScan(mode = 0) {
		rfidValue.value.isScanning = true;
		return rfidManager.startInventory(mode);
	},
	stopScan() {
		rfidManager.stopInventory();
		rfidValue.value.isScanning = false;
	},
	scanSingle() {
		rfidValue.value.isScanning = true;
		return rfidManager.inventorySingle();
	},
	/**
	 * 绑定事件监听
	 * @param {string} epc 读取的标签的EPC值
	 * @param {number} area 0:RESERVED,  1:EPC,  2:TID,  3:USER
	 * @param {number} addr 起始地址，如果是要写EPC，则填2
	 * @param {string} psw 密码，默认8个0 写数据的区域
	 * @returns {Object|null} 返回读取的内容或null
	 */
	readTag({ epc, area, addr, psw }) {
		const res = rfidManager.readTag(epc, area, addr, psw);
		// 成功返回内容
		if (res && typeof res === "object") {
			return res; // 返回内容
		}
		// 失败返回null
		return null;
	},
	/**
	 * 绑定事件监听
	 * @param {string} epc 写入的标签的EPC值
	 * @param {number} area 0:RESERVED,  1:EPC,  2:TID,  3:USER
	 * @param {number} addr 起始地址，如果是要写EPC，则填2
	 * @param {string} psw 密码，默认8个0 写数据的区域
	 * @param {string} writedata 要写入的数据（16进制的字符串）
	 * @description 注意：RESERVED区和TID区不允许写入！
	 * @returns {Object} 返回写入结果
	 * - code: 0表示成功，其他值表示失败
	 * - message: 错误信息
	 * @example
	 * rfid.writeTag({
	 *  epc: "12345678901234567890",
	 *  area: 1,
	 *  addr: 2,
	 *  psw: "00000000",
	 *  writedata: "1234567890ABCDEF"
	 * });
	 */
	writeTag({ epc, area, addr, psw, writedata }) {
		if (area === 0 || area === 2) {
			console.warn("RESERVED区和TID区不允许写入！");
			return {
				code: 256, // 返回256表示失败
				message: "RESERVED区和TID区不允许写入！",
			};
		}
		if (!rfidManager.isConnected()) {
			console.log("RFID未连接，调用connect方法连接");
			const connectRes = rfidManager.connect();
			if (!connectRes) {
				return {
					code: 257,
					message: "RFID连接失败，请尝试初始化再写入！",
				};
			}
		}
		const res = rfidManager.writeTag(epc, psw, area, addr, writedata);
		return {
			code: res,
			message: RFID_ERROR_MAP[res] || "未知错误",
		};
	},
	destroyRFID() {
		try {
			rfidManager.disconnect();
			rfidManager.power(false, (result) => {
				console.log("rfidManager.power :" + result);
			});
			rfidManager.soundRelease();
			rfidManager.release();
		} catch (e) {
			console.log("destroyRFID error:", e);
		}
	},
};

export default rfid;
